#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    # shellcheck source=../common/0_env.sh
    source "../common/0_env.sh"
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试 软链接文件 的创建和删除"
echo -e "***********************************************************************"

tmp_dir="/test_symlink"
abs_tmp_dir="${MountPoint}${tmp_dir}"

function test_no_quota()
{
    echo -e "\n----测试没有配额时创建和删除 symlink------"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=100 count=1"
    test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"
    clean_dir ${abs_tmp_dir}
}

function test_dir_quota_not_exceed()
{
    echo -e "\n----目录配额: 创建 symlink 且<不超出配额时> usedsize 和 usednum 正常增加------"
    limits="--hardsize=1000 --hardnum=1000"
    create_quota ${tmp_dir} ${limits}
    
    file_size=100
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
    test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"

    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir}
    
    clean_dir ${abs_tmp_dir}
    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir}

    remove_quota_dir ${tmp_dir}
}

function test_dir_quota_exceed()
{
    echo -e "\n----目录配额: 测试创建 symlink 超出容量配额------"
    limits="--hardsize=1000 --hardnum=300"
    create_quota ${tmp_dir} ${limits}
    
    file_size=990
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
    test_error_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"

    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir}

    echo -e "\n----目录配额: 测试创建 symlink 超出文件个数配额------"
    limits="--hardsize=10000 --hardnum=3"
    create_quota ${tmp_dir} ${limits}
    test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link_1"
    test_error_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link_2"

    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir}

    remove_quota_dir ${tmp_dir}
}

function test_id_quota_not_exceed()
{
    if [ "$1" == "DIR_UID" ];then
        echo -e "\n----测试用户  配额: 创建 symlink 且<不超出配额时> usedsize 和 usednum 正常增加------"
        idStr="--uid=${SysUid}"
    else
        echo -e "\n----测试用户组配额: 创建 symlink 且<不超出配额时> usedsize 和 usednum 正常增加------"
        idStr="--gid=${SysGid}"
    fi

    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}
    limits="--hardsize=1000 --hardnum=1000 ${idStr}"
    create_quota ${tmp_dir} ${limits}

    file_size=100
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"
EOF

    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir} "${idStr}"
    
    clean_dir ${abs_tmp_dir}
    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir} "${idStr}"

    remove_quota_dir ${tmp_dir} "${idStr}"
}

function test_id_quota_exceed()
{
    if [ "$1" == "DIR_UID" ];then
        echo -e "\n----测试用户 配额: 创建 symlink 超出配额------"
        idStr="--uid=${SysUid}"
    else
        echo -e "\n----测试用户组配额: 创建 symlink 超出配额------"
        idStr="--gid=${SysGid}"
    fi
    
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}
    limits="--hardsize=1000 --hardnum=1000 ${idStr}"
    create_quota ${tmp_dir} ${limits}

    file_size=990
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
        test_error_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"
EOF

    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir} "${idStr}"
    
    clean_dir ${abs_tmp_dir}
    sleep 1 # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    check_usedsize_and_usednum ${tmp_dir} "${idStr}"

    remove_quota_dir ${tmp_dir} "${idStr}"
}

function test_uid_gid_quota_not_exceed()
{
    echo -e "\n----测试用户和用户组配额: 创建 symlink 不超出配额------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardsize=1000 --hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"

    limits="--hardsize=1000 --hardnum=2000 --gid=${SysGid}"
    create_quota ${tmp_dir} "${limits}"

    file_size=90
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"
EOF

    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_uid_gid_quota_exceed()
{
    echo -e "\n----测试用户和用户组配额: 创建 symlink 不超出配额------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardsize=2000 --hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"

    limits="--hardsize=1000 --hardnum=2000 --gid=${SysGid}"
    create_quota ${tmp_dir} "${limits}"

    file_size=990
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
        test_error_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/s_link"
EOF

    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diff_id_quota()
{
    echo -e "\n----测试用户和用户组配额: 创建 symlink 时 symlink 的uid 和 其父目录不一致------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    test_cmd "mkdir -p ${abs_tmp_dir}/dir_root/"
    test_cmd "chown -R root:root ${abs_tmp_dir}/dir_root/"
    test_cmd "chmod 0777 ${abs_tmp_dir}/dir_root/"

    test_cmd "mkdir -p ${abs_tmp_dir}/dir_hzz/"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}/dir_hzz/"
    test_cmd "chmod 0777 ${abs_tmp_dir}/dir_hzz/"

    test_cmd "mkdir -p ${abs_tmp_dir}/dir_orcadt/"
    test_cmd "chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}/dir_orcadt/"
    test_cmd "chmod 0777 ${abs_tmp_dir}/dir_orcadt/"

    limits="--uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"

    limits="--uid=${HzzUid}"
    create_quota ${tmp_dir} "${limits}"
    
    file_size=100
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=${file_size} count=1"
EOF
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${HzzUid}"

echo -e "\n  >> symlink 的 uid 和 其父目录一致, 都为 ${SysUser}------"
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/dir_orcadt/s_link_orcadt"
EOF
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

echo -e "\n  >> symlink 的 uid 和 其父目录不一致------symlink属于配额 ${SysUser}, 其父目录不属于配额(root)"
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/dir_root/s_link_orcadt"
EOF
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

echo -e "\n  >> symlink 的 uid 和 其父目录不一致------symlink 不属于配额 root, 其父目录属于配额(${SysUser})"
    test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/dir_orcadt/s_link_root"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

echo -e "\n  >> symlink 的 uid 和 其父目录不一致------symlink 属于配额 ${SysUser}, 其父目录属于配额(hzz)"
    su ${SysUser} <<EOF
        echo -e "\n\tsu ${SysUser}"
        source ${commonFunc}
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/dir_hzz/s_link_orcadt"
EOF
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${HzzUid}"

echo -e "\n  >> symlink 的 uid 和 其父目录不一致------symlink 属于配额 hzz, 其父目录属于配额(${SysUser})"
    su hzz <<EOF
        echo -e "\n\tsu hzz"
        source ${commonFunc}
        test_cmd "ln -s ${abs_tmp_dir}/file ${abs_tmp_dir}/dir_orcadt/s_link_hzz"
EOF
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${HzzUid}"

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${HzzUid}"
    
    remove_quota_dir ${tmp_dir} "--uid=${HzzUid}"
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

remove_all_quota_for_dir ${tmp_dir}
mkdir -p ${abs_tmp_dir}
clean_dir ${abs_tmp_dir}
orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
chown -R root:root ${abs_tmp_dir}

test_no_quota

test_dir_quota_not_exceed
test_dir_quota_exceed

test_id_quota_not_exceed "DIR_UID"
test_id_quota_not_exceed "DIR_GID"

test_id_quota_exceed "DIR_UID"
test_id_quota_exceed "DIR_GID"

test_uid_gid_quota_not_exceed
test_uid_gid_quota_exceed

test_diff_id_quota # bug1267

rm_abs_dir ${abs_tmp_dir}